{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "问题描述  \n",
    "运⾏课上给出的notebook的代码：  \n",
    "https://www.tinymind.com/ai100/notebooks/74  \n",
    "给出代码的运⾏log截图并提供⼼得体会⽂档描述对整个模型构建及训练过程的理解。 \n",
    "\n",
    "解题提示  \n",
    "作业格式要求：  \n",
    "1. 提交jupyter notebook生成的可执行文件（.ipynb文件）或者pycharm生成的包含源码的.py文\n",
    "件，所有题目完成在同一个文件内即可。  \n",
    "2. 将输出结果截图，和心得体会整理成一份markdown格式的文档，或输出为pdf格式，并提交。    \n",
    "\n",
    "批改标准  \n",
    "代码不作为评判标准，如果运⾏正确，则认为代码没有错误。  \n",
    "没有明显报错的正常的log输出 60分。  \n",
    "对模型结构的理解10分。  \n",
    "对模型训练过程（梯度如何计算，参数如何更新）的理解10分。  \n",
    "对计算图的理解10分。  \n",
    "解释这⾥的模型为什么效果⽐较差10分。  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 运行课程提供代码(https://www.tinymind.com/ai100/notebooks/74)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-1-10851fbcbf75>:9: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)\n",
    "\n",
    "mnist = input_data.read_data_sets(\"./\")\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcoAAAHRCAYAAADqjfmEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dd3hUxfrA8XdSCCWhK0qvoSlFxV5QwILYe0O9KAo2rop69frzcr2WawXERlGx14uKDSvYUBBRBOlFOkjvIWV+fyTMnFmzw2azm00238/z+PjOzuzZ0ZPdOWfmzIzSWgsAACheSqIrAABAeUZDCQCABw0lAAAeNJQAAHjQUAIA4EFDCQCABw0lAAAeFbqhVEpppdR2pdR9EZbvp5TaVvS+1vGuH0qG85l8ojinQ4rKa6VUWrzrh5KprN9RVZEXHFBKaRFpo7VeUJQ+RkQ+DilWQ0TO1Vq/E+59KB+KOZ/1ReQ9EWknIqkiMltEbtVaf+d7H8oP37lRSl0uIi+IyNVa69GB15uLyGIRSdda55VNTRGJ4s6nUipVRIaIyN9EJEtEFojI8VrrTb73VSRJdcWmtf5GRDL3pJVS3UVkvIh8kqg6oVS2SeGXb76IaBE5Q0TGK6X25Qe0YlNK1RGRf4jIrETXBaU2RESOFJEjRGSpiHQUkV0JrVGMVeiu1whcLiJva623J7oiKDmt9S6t9VytdYGIKBHJF5E6IlI3sTVDDDwgIsNFZF2iK4LoFV3wDJLCXoE/dKGZWmsayopAKVVdRM4VkbGJrgtKRyk1QwqvUN8XkdFa67UJrhJKQSl1qIgcIiLPJLouKLUDRSRPRM5VSq1WSs1TSl2X6ErFWlJ1vYY4RwqvVicluiIoHa11J6VUVRE5S0SqJLo+iF7ReNZTInKD1rpAKZXoKqF0GotILRHJFpEWItJGRL5QSs3TWn+W0JrFUNLeUUpht+uLuiI/rQSjqBv2NRG5QynVOdH1QdQGisgMrfXkRFcEMbGz6N//1lrv1FrPEJHXRaR3AusUc0nZUCqlmohIdxF5McFVQeyli0jLRFcCUeshImcVddOtlsKHQB5VSo1IcL0QnRlF/07qG5Jk7Xq9TES+11ovTHRFED2l1OFS+Dc6RQqnh9woIg1E5MdE1gulcoWIVA2k/ycib4vImITUBqWitV6olPpGRO5SSt0ohRexF4jIRYmtWWwla0PZV0QeTnQlUGoZUvhkZEsRyRWR30TkVK31yoTWClELzq0TEVFK7RaRLVrrzQmqEkrvIim80FkvImtF5G6t9ReJrVJsVfSu1xwRmaaUujf4ota6ndb6L1eoSqkrlVKbit5XUEZ1ROSc86m1nqS17qy1ztJa19VaH6e1/npPYc5nhVDsd3QPrXX3kMUG7hGRX4vel9TdeRXUX86n1nqF1vpkrXWm1rql1vrZPXnJ8h2t0CvzAAAQbxX9jhIAgLiioQQAwIOGEgAAD+9Tr71SzmMAM0E+K3grLkuWcE4TJx7nlPOZOHxHk0+4c8odJQAAHjSUAAB40FACAOBBQwkAgAcNJQAAHjSUAAB40FACAOBBQwkAgEeybrMFAEi0lFQTzhvV1cmaddJTJj7t8gEmTvtiWvzrVULcUQIA4EFDCQCABw0lAAAejFECAGIirVkTJz3vgXomXtx9dEjpKiba1MrG9b+IS9VKhTtKAAA8aCgBAPCg6xXlWmqHbBPPGVDHyZt/9tMmLhB3C78UsdvKPbWphYnHPtbbKVdvzOSY1BOorNJaNjfx73fVd/L+2t1qXb3sKBM3+GadifNjV7WY4Y4SAAAPGkoAADzoekXCpTVp7KR/v2c/E792wrMm7ppR4JQrCFznFYibF7wG7F97gYkb3v6KU+q5CceYOG/5isgrDUdK1aombvq1cvKeavSdiVOVPS+zd+9wyt1yUl8T589dICi/VLp9SnX2v+qaeHHP8F2tLT//m5Nu2/93Exfsmh/D2sUed5QAAHjQUAIA4EFDCQCAR4Ubo1x185FOWgVmBVRdbxMb27nv23+yfei46vgpcakbIrfooSNMPOeSJ5284FSP4DSPgpDrug931DLxlG0tw37WwTWWmPiczC1O3soJM038QUd3+gn8guOSK163U3A+aPRKccVFRKT7zDNNrB51pxJkLPyl1HVKa97UxHlLlpb6eCje3BGdTby456iw5VpPvMLEbfr+7OSFPlVQnnFHCQCABw0lAAAeMel6XXud2x26qVOuicedOCIWH2G0rzI1bN4unWfiWinVnLy1l2038crh7n/2Y6t7mXj9+TVNnLdsedT1hN95veyUgdBVddypHvZa7slNrZxyn53U0cS+qR3fnXahiU9/5mknLzh15APp5q80HAv+ZTfindPtybDl2nxxlYnbDphr4oLtS5xy7l9BZOaNdM/Zeyc+YeILXrjZyWv6r++j+ASIiCwYerib7vNUIGW/oy0/c6eAZPefZeJozm95wR0lAAAeNJQAAHjQUAIA4BH1GOW8UXZsYE7vYU5ehkoPpqL9iBJzP9e1b2qNQOzmvdjsaxNf+kZ3E2+8uKlTjsfNS+nQA014bT07Vvjhjv2cYsGpHjO3NDRxzuB9nHILH7InMvve6k5e/my7JFZwOlD6s+7Jzw0MnKy43R1rb/RfxrSC9BGdnfTXFz8cSNn//0vz3KXpsvvZKTgFubtLXY/cngebeFwv9xmIjoGl1VA6u0+2v/Hjzhzq5KUqOzXImQJy5a9OOV1QHvcCKTnuKAEA8KChBADAI+qu16ePf9HEoV2e/13fxsRrd2dFdfz/TbPdK03HK0/JyCzvYa8JHur9qpMXXK3l5eYTTXzpq92dchsvsLtcMHUkClN+M2H/cwaYOHXVBqeYO9VjtYlW3O6uvjP7ODsV4JRRVzt5qbNtvL6fXQUoV09zygWnojR75Q+3HqH1r+TW3O52m+6bartbd2qb13fQLU656rk/xrQe2/5uv68HVnF/e7bpHBO3eGu9k5ccnYBlp95di03cqUpVJ6/X7NNMnH2PPR/5SdLVGoo7SgAAPGgoAQDwiLrrdegF55r4n11qOnn7vmtX38hf73arRSpbwq/AE43W4208+rneTt7q1+0qMdfVXmbiYDesiEjb/ra7sPnddL2Whp5qu2Ej7eKsus5d22Pk5uYmrrJmm5O3aIh9gvWFy2wXbXCRdRGRaTn2WpGNm/36Z38bNu+sueeZuPq48F2tKs3+5Khq1cKWC5V/oO12f7z982HLdZ92pYn3nTUn4uPjr25s9HnYvC1j7TBU7fmTy6I6CcUdJQAAHjSUAAB40FACAOAR9RilnmZXha/nPnFf7h/DLpjhjl08/3gfE1835OnQ4sarl9oViO68+9DYV6yS2nmG+/9yQzv7Zxkcl6z3mzsO2b/WEhN3+cCd2nFohn1fcArI1Bz32vCf/ey0klRxN5ZF5LLSd5l4e0he7omHmLju3UtM/EbLT0vwCZOKffW7kPO5z4NltxJYMtp8qd0l5NiqdiPto2ac7ZSr/dIPZVan8oA7SgAAPGgoAQDwiMnGzUBprLzAXfFl9nG2+zs4nSN0g+dgXrCrNTQvOAXksrevd8q1/Cr5H22PlZGjTnPS195qFyR/saWdf3Xt9yc75cY0s+czTUJ2JCilK8Zf66TbTK5cXYKxtun00I7zQjvedzcuyNSL4leJlJC/kXKw2g93lAAAeNBQAgDgUSm7Xpff6e47WNB1a0Tva5BquwjzTjjYyUv7clpocUQp+JRq8FrOfd2f13/ZCSZe9g+7SD9drdHb3jj0/79VTdl9IMc2+zIk13al3bLaPuH80YRuTqnc/e33a8GJoyKqU/2fS79hAqz962wp9vVq68Of+2jlnGLP/7qr7R6mBzRY5ZTbeq7928pbtVoSgTtKAAA8aCgBAPCgoQQAwKPCjVGmtWzupBf029/ET104MqJjdK/qrsCSqiK7Xmiclmnikc8Pc/IGNjs6omPgrxq+UcVJn9fITkM4oOZKE19b73unXKPAxsGh13wLH2hv4mpfTYlBLZH97J9Oun3udRG9r/VLdgehgrkLTdwizx0vXvTgERKJgSuOMnHdV91nA3RoYXil7dfASY9q+0oglSmllVq7lonPnDzfybsga7iJa6WE30mm44hLTNz4HMYoAQAod2goAQDwKLddr9vOO8zEfx5k2/N/n/26U+7CrI1RHL301wc9Px/kpLPlp1Ifs7Kq9p7bNZrzno2nBc5V/24DnHJb77WriHx54BtO3tH/siu0/DqtiYnZnDl6+fMWOukWdywMUzLkfREeP21HZFM9fhrdxcT1c5nuUyrp6U6yaVrpulvXDnSn3p15zUQT96+1MqR0ZBt375NV/GpBZYk7SgAAPGgoAQDwoKEEAMAjoWOUqmtHE9ce4S5b9FFzu+NApNM33t1u+9dn7mwcttwHD3V30qk59qHyy/9td0H4a5+6VWV1eti8yiStifv/OW/Z8rh9lp76m5PODGxScd4kd2eLca0/MvEBV9mpO03/xRhleaU8g5l5gZHOOvNyyqA2lYPe6i7fOXJzQxP7fv9S69cz8bK/tTXxb4OeimHtCm3eWdXE+8b86JHhjhIAAA8aSgAAPMq06/WPIe6jw3dfaB/pvyRrvZO3NM+uJj9ndx0T3/DaVU656qvsI+X7T1xn4vzf54WtRy0Jv7nr/H8EVqoI6XpYnLvNxM3f2yaV1c4z7A4QwWkYIiIf/GG70/c/c3aZ1WnzI02ddMEztjs9t83OMqsHonflRRPC5p23wHatp078OWw5lEz+ps1O+rXldkeP/rXsPK2jbv/RKdftXrtx8/mZX8S0TkP+7OCkG95op4fkxfSTIscdJQAAHjSUAAB4lGnXa+1ua510sLu1x++nO3m5T+xn4uDKLc0l/Eocka4AEqrguK4mPrP2mECOex2xoSCwePcU9wnMZBd8uvWCBz428U9bmjvlyrK7Nbjg8rkPut12KcKGvuVd6j77OOk2GQvCll33dHMTZ0liFsauDHY9bzeZyHk418QP7zc95p+Vq+0vdodJ/Uyc/Q93GC7vj2Ux/+yS4o4SAAAPGkoAADxoKAEA8CjTMcp6/dwpFa1vtrtBtBrsjj2mydIyqZOIyMZsu/LDUVXDXzv0n3mpietL+OknyeiPi+30i+Bj449P7+mUayWxH8swDj3QSZ7y/Ne2TrXd8a2CwDVg+rzIdilA2dp8fCsnfVp1O868Tbur71RdlyuIv5qv2uleP/7Hrj52bNXiSu9dvi4w8SE/XezkVXnbTvtr+ZL9/U/UFBAf7igBAPCgoQQAwKNMu17zVrmPdbcaXD4e817frfib/dm7dzjprKdqFVuuMmj0lV08Of2mVBPf1OVLp9yYG041cb1ZbvdZ2pfTij12aodsJ72yR30TZ55q/0a+OvAFp1xwCkhByDVf9sfX2HjI98V+LhLr8iHvh81bnOuez/TPi//bQWK0+/YyE6uZWSZuMXyWU07n267XfbfOiX/F4oQ7SgAAPGgoAQDwoKEEAMAjoRs3J8pJM7c46XG1nwyk7DJ1l8+63ClX5+Op8axW+RZYsu+oGWeb+MsD33CKXXvHEyYukAInb8jag4s99Om1XnPSXTPs+1IC13Khxwte57V9+zonp8PDdtmr8vi4OUTqpYbfgeeRVSeFvLIpvpWBV4enBzrp5g/YZUV1nv2GRbuMaHnHHSUAAB40lAAAeFTKrtdza85w0tVTMk08L9duElp9RO0yq1NFUvvq3SYe8r7bnXp/A/v/Nlc7WXLvvr+YuEBsZuhOH8GpHmvy7abLT613N/7+dMRRJm4zxl3Zie7Wim13QereCyGu7mvZxcRNxJ1ipUMLJznuKAEA8KChBADAo9J0va4daLvtGqS6T68uzrVP3110/2AT1/84/CbRlVnesuUm/vW0Jk5e6/8W/2SriMjs7qNNfOyM803854aaYd/TeqjtRNVT3c2y63k28UbFNqr5B0764Ef/buJWt/wQWhyIK+4oAQDwoKEEAMCDhhIAAI+kHaNUGRlO+pxr7S4XWwt2O3m9p9gNpJs+y7hXSeQtX+GkW12yIkxJkT5ixy9rysJAHF5lewy9Mrnr9UucdLu+j9k43f3+SoE7hQgoS9xRAgDgQUMJAIBH0na9SoHbaffS+ONN/PGv3Z28pm/yuDlQ1pr9nzvMcfP/HRG2bCumAiGBuKMEAMCDhhIAAA8aSgAAPJJ2jFLnulNAmt/FGAcAoOS4owQAwIOGEgAAD6U1a58AABAOd5QAAHjQUAIA4EFDCQCABw0lAAAeFbqhVEpppdR2pdR9EZbvp5TaVvS+1vGuH0omivPZs+h8Fiilesa7fig5vqPJJYrzOaSovFZKVdh5+xW6oSzSWWt9156EUmqkUmpu0Y/nFcGCWusxWuvMMq8hSiL0fJ6glPpZKbVFKbVIKdV/T57W+vOi87k0ITVFpPiOJpfQ89lFKTVNKbWj6N9d9uRpre8RkY4JqWUMJUNDGepXERkoIj8nuiIoHaVUuoiME5FnRaSWiFwgIo8ppTontGIoLb6jSUIpVUVE3hORl0WkjoiMFZH3il5PGknXUGqtn9RafyEiuxJdF5RaXRGpKSIv6UJTRWS2iHRIbLVQGnxHk0p3KVwKdajWOkdrPVxElIickNBaxVjSNZRIHlrrNSLymohcqZRKVUodISLNROTbxNYMQJGOIjJDuyvXzJAk6G4NqrCDq6g0XhOR0SIyrCg9QGu9LIH1AWBlisjmkNc2i0hWAuoSN9xRotxSSrUTkTdEpK+IVJHCq9TblFKnJrRiAPbYJoXDI0E1RWRrAuoSNzSUKM8OEJG5WusJWusCrfVcEflQRE5JcL0AFJolIp2UUirwWqei15NG0jWUSqkqSqmqUjignK6UqqqUSrr/zkpiuoi0KZoiopRSrUSkjxQ+NYkKiu9oUpkoIvkicqNSKkMpdX3R618mrkqxl4x/nJ+KyE4ROVJERhbFxya0RoiK1nqhiPxNRIaLyBYRmSQi74jImETWC6XGdzRJaK13i8iZUjg8skkKv69nFr2eNCp6Q5kjItOUUvfueUFr3V1rrUL+mSgiopS6Uim1qeh9BYmpMjyKO59vaq0P0Fpnaa0ba61v11oXiIgopXoUnc8GUnhVi/KH72hyKe58TtdaH6y1rqa1PkhrPX1PnlLqHinsAcoRkQq7pyP7UQIA4FHR7ygBAIgrGkoAADy8Cw70SjmPftkE+azgLbX3UiXHOU2ceJxTzmfi8B1NPuHOKXeUAAB40FACAOBBQwkAgAcNJQAAHjSUAAB40FACAOBBQwkAgAcNJQAAHjSUAAB40FACAOBBQwkAgAcNJQAAHjSUAAB4eHcPqcgWv97JSX971NMmvrjvDU5e6lc/l0mdAIS38NHDTXzTyR87eR9ddISJC2bMKbM6IQKH29/axTe5m2/MO26siVtPvMLJa3XxL3GtVixxRwkAgAcNJQAAHknb9aqX1nDS9Y6pZuINbTOcvH2+KpMqIcZyTu1m4g1Xb3Pypnd7JaJjXLv8GBN/+3FnJ6/ls4tMnLdqdTRVhEdao4ZOesQZz5u4V7WdTt7Yw3qbuN6M+NYLe7d60JEmvv/650x8YrXtTrncwBbUww593ckbLu2KPfaaG4500g1ftV3t+es3lLiuscAdJQAAHjSUAAB4JG3Xa43lKmzefhf84aTzn4l3bRAtlV7FxPMe6+rkfXja4yZune52pxdEePxnGn9j33P1105elwP7mrjxOXS9xtrCa5o56dDuViSWyrDfqY3nH+TkfX3royaurqpIaS3/h+1unXrdUCfvzesam3j40HOcvH2emVzqz44Ed5QAAHjQUAIA4EFDCQCAR9KOUfrszEt30qXvYUe8zH2ii4nnnfaUk5ciVU1cIFoi0X9Zdyc9usmksGWHd7GPsz9a7zgTJ+oR9WTT5Kjlia4CPBb9y45Lzuo7IiQ3sl/NZza1NPGzL53q5DWS702cU88+VZCuUp1yl2StMnG3Ox5z8i6Tm00cz/FK7igBAPCgoQQAwCNpu15rnroqbN7md9wVQfaRP8KURFkITgERcbtbZ/UJdvm4XTKr8neY+Nhxtzp5LcftNnHGfDu1I3/deqdc1zcuMfG0bi87eT/vbG5ivTs3TO1RErv6HGriYS2fCMlNFyRWcEpIjQ4bS/z+j3dkOel3bjvRxI0+/D60eIllh/xWvP6PR0x8UtdBttw1U0v9WUHcUQIA4EFDCQCABw0lAAAeSTVGmd/dPs48vuOTTt4vu+34VoNXZjp5kS53hvhYdd0hTnreacGxK3vexmxu6pT739W9TNzmux/CHj/P89k5OeHHxcavsBvSVtu62HMURGpnPXs+D6zCmGSiqTS3CVj4b/sb+vshoVNCiheccrX2HHeMMmNFZGOFzT+0zxR0anaFkzftiDEmDp060iLNThGrOSd+f0/cUQIA4EFDCQCAR3J1vWbYdj9TubtJ5Gq7ckvB1q1lVifs3YD+7znpFLE7vzywvoOJJ5+e7ZRTS36J6PipNWuaePlVBzh5t3X6n4mn73Y74audRHdronyX417DZy3zdaAjWjk93R15fr80su7Wm1YeZeI1p9ouz/z1K6OqR+pXP5u46Vdu3ri5+5v4/My1UR2/tLijBADAg4YSAACPpOp6XXIW7X5FlB9yvRZc4Pyj+7ubOGtJ+CdbJcV9Gi7/uM4m7jPiCxNfW9vt1wl2854698yQg64I/3mISrtrZ0VUbujyXk66yiexXWmlMltzo90keeCAdyN6T7CrVURk8XH2O1uwI/k3CaBlAQDAg4YSAAAPGkoAADySaowyaz+mfSSb6qt3772QuGOSIiIfvzwqovedtaC3iVPO2eHk5Ud0BJTEwAbBMWIVttzcj9s46cbyZ5xqlPxSOrd30g/eaFe66VFtR2hxI7jiTnAKiEh8xyVV145Ounn6z2FKiizIzTFxrUXxm0LEHSUAAB40lAAAeCRV1ysqpvk7G7gv1FpiwudeHG7iB9f0dIpN/KO1iT85dLi4qploc8EuE3f78O9OqXa32OkKBdu3R1plxFmzd92uVrrBo3fMS27Xpa+7NWjquweauNH60m+6HKm5A6o76UMzdJiSIhO225W7qr03JW514o4SAAAPGkoAADwqfNdrSlW7H9nRjcIvYj1q7XGB1LY41gglNfu6Du4L7/xowv1TbRfqsIbfOcVSGtruoIJAV2uo458YbOLsh9wuJPYijb/gSjBt04P//6s65VbkB7oE8+hsLY111xxh4gF1Hg3JtRtGrMrf6eTc/Iddnarp/9aYON5nI61FMxNPOvnxkNzw3+1vN7QOpNbFtlIB3FECAOBBQwkAgAcNJQAAHhV/jLJ2LRM/0fDjsOUmfWs37G0lnl0oUCZyTu1m4mUXuitqpHhWbAlKVYHrPO2ONvaYdbaJGz5Udo+2QyS1wb5OuuvFv5m4ZkrV0OJG93G3mrjNfL6jpbHVDvlJZkpG2HKPrD3efd8xwXG++I35hZp7nd2cOfhcQqiNgaleIiKrh7UycQ3GKAEASAwaSgAAPCp812te8wZ7LyQiTT/JjXNNECqlUzsnvd9IuxHy6CbPmji4UXNhunh3rO7mpP835RATP91rrJM3pu3LJu57vu3Sy3yTLr24q1/HSY5u8kmxxbaEdKNlLea6vax98vkhTrqFTC67D1d2iEWnesoF3Lr8FCdd4+0fw5SMLf4yAQDwoKEEAMCDhhIAAI8KP0a57q5dxb7ee87pTrrKxF9NHH4tepTWuv526awJdz/i5NVypgaEnwJyy6rDTfzxl3YMJftxd4nC7FV2t4BHjr/EyQtu3HzhPXba0AdvuuNniL38GlUiKvdbrrtLxH5DmcZT1vb/LnFLBW6+5DATzzn/yYje8/137nKXZTXVjztKAAA8aCgBAPCo8F2vTx/wSiBlnzFeuaWmU65h3vIyqlHlsvXCw510sLu1VsgqLLNz7RSdx1f3MvHcoR2dcrXe/cXELXfZx9Xd9XtcqZN+ddLt3rzOxL+eN9TE40683imX/ulPnqMiGlmProqo3IDpbnd5Y5kVpiTipdmdc5z0mvGxPX5a40Ymnn9dUyfvx0uDu5qEXz3ota12CmD28xudvLLqOOaOEgAADxpKAAA8KlzXa1pz9/Y9S9kn5VJVellXp9Jb18l9ejXY3Tpue10n7/nzTzVxwS+/mzgr5Mm1aDZTTqnmdvN2PGiJiTMCfxcFaZEtuI6SSWvS2MTZmUvDlrtkSU8TN7tqpZPHVs1l7+jaC5z0u23sUEr+/EURHSO1fRsTz7+8vpM39NznTXxite0h7wzf3Ro09rozTJw2a1pE74k17igBAPCgoQQAwIOGEgAAjwo3RrlrtJvOTrdjU/mBzXsz33Snh6BsBDddvv2r85287F+mxvSzUuvXM3H1ce7Y4xstPwqkGJeMt9W9m5j4/X3fd/KCG2xv3GVX40nZ7T7qr9Ltij46d3esq1iptBltp+gM6d3FybtnHzv96sqay5y81Pftb+hvOxpLJLrUmGTiS7IimxoU6v3tdsWsWz+/0Mlr94OdNhTN8wuxwB0lAAAeNJQAAHhUiK7X1OxWJr6l+fthy1202K72UvP1stnQs7KrP8NdYn5jwU4TT+091Mnr9uwgE7f/vz9MnL9mbdjjpzVqaOLtnRs5eYOGvWbiU6tvdvKCXTRPbrJ/P9W+mRO2HOIjOCTyUbvA93eeW67N2wNtfBMbbJdG3qIlJp4w/Ggnb9AQ+/82dPWsvjXt5uoSjGNgh3a705/cYLuEv/6b3ZQ9+6cpTrny8B3ljhIAAA8aSgAAPGgoAQDwqBBjlLsb1TJxj2o5YcvNe6OtiRtoNoEtC1mvu2NJx7YebOJfBzzh5M3r84yJZ51o9wIZNP+CsMd/pb3dHSZ0PCU4FSV0HCO4+fOcG+xmr2rrr4LYq7rBnoGFeTudvFZp1Yp9z86QMavqq7huj4e6z0120v83oIeJr91nopPXPj22y4AGnw94adgpTl79kcF6zYzp58Yaf5kAAHjQUAIA4FEhul59rl1+jIkbvjbXxOxEkBh159j/889saunkdahqN8/uXooyhf8AACAASURBVNV2m37W8R3PEauGzXlmczMTP/5hHyevzd3TTax20d0ab5lv2elY5+832Mn75R9Pmfg/69qZ+J2RJzjlGo1guKQsLOy2y8R3tL7IzbtiPxOfdLLd1PzR/d0hlo4v2g3QlefHttWr601c//fJ4QuWc9xRAgDgQUMJAICH0lqHzeyVcl74TMTVZwVvxWUl70Se0+Cm2/MfrB223AMHvWvi77e2NvH4CYc55VrcWbG6cuJxTvmOJk4yfkcru3DnlDtKAAA8aCgBAPCgoQQAwKPCTw9BxZG3ZKmJW1y4NGy5kRKcVmJXfGkhFWtMEkBy4I4SAAAPGkoAADxoKAEA8KChBADAg4YSAAAPGkoAADxoKAEA8KChBADAg4YSAAAP7+4hAABUdtxRAgDgQUMJAIAHDSUAAB4VuqFUSmml1Hal1H0Rlu+nlNpW9L7W8a4fSiaK89mz6HwWKKV6xrt+KLkozumQovJaKcXuRuVMZf3NrdANZZHOWuu79iSUUqcppWYWnZzvlVId9uRprcdorTMTU01EKPR8nqCU+lkptUUptUgp1X9Pntb686LzGX7PLpQHoee0i1JqmlJqR9G/u+zJ01rfIyIdE1JLRMqcT6VUfaXUd0qp9UqpTUqpyUqpo/YUTJbf3GRoKA2lVBsReUVErhWR2iIyXkTe58q0YlJKpYvIOBF5VkRqicgFIvKYUqpzQiuGqCmlqojIeyLysojUEZGxIvJe0euoeLaJyN9EZB8pPJ//FZHxyfabm1QNpYicJCLfaK2/1VrnSeFJayQixyW2WohSXRGpKSIv6UJTRWS2iHTwvw3lWHcp3DB+qNY6R2s9XESUiJyQ0FohKlrrXVrruVrrAik8j/lS2GDWTWzNYivZGkpV9E9o+oDEVAelobVeIyKviciVSqlUpdQRItJMRL5NbM1QCh1FZIZ2J3DPELpbKzSl1AwR2SUi74vIaK312gRXKaaSraH8TESOU0p1L+rKuVNEqohI9cRWC6Xwmoj8n4jkiMg3InKX1npZYquEUsgUkc0hr20WkawE1AUxorXuJIW9PxdLEl7IJlVDqbWeIyKXi8gIEVklIvVF5HcRWZ7IeiE6Sql2IvKGiPSVwguejiJym1Lq1IRWDKWxTQp/UINqisjWBNQFMVTUDfuaiNyRbM8RJFVDKSKitX5ba32A1rqeiNwjhV11UxNcLUTnABGZq7WeoLUu0FrPFZEPReSUBNcL0ZslIp2UUsEhkk5FryM5pItIy0RXIpaSrqFUSh1cNJ61jxQ+LTm+6E4TFc90EWlTNEVEKaVaiUgfEfk1wfVC9CZK4QMfNyqlMpRS1xe9/mXiqoRoKaUOV0odrZSqopSqppS6XUQaiMiPia5bLCVdQykiw0Rkk4jMLfr31YmtDqKltV4ohY+eDxeRLSIySUTeEZExiawXoqe13i0iZ0phd/omKTy/Zxa9joonQ0SeFJH1IrJCRHqLyKla65UJrVWMVejdQ5RSu6TwIY/hWuu7Iyh/pYg8LiJVRaSD1npRnKuIEojifPaQwoYzQ0R6a62/inMVUUJRnNN7RORmKTynNbTW+XGuIkqgsv7mVuiGEgCAeEvGrlcAAGKGhhIAAA8aSgAAPLwL1/ZKOY8BzAT5rOAttfdSJcc5TZx4nFPOZ+LwHU0+4c4pd5QAAHjQUAIA4EFDCQCABw0lAAAeNJQAAHjQUAIA4EFDCQCABw0lAAAeNJQAAHjQUAIA4EFDCQCABw0lAAAe3kXRgURIa9bExJsOa2TiVX12O+UGHDTJxIPqzHPyDvj2ShMXLKlh4tZDfnXKFezYEb4e++9n4rxVq/dWbSCp5PU42MTrO2Y4eTv3teu269bbTXx750+dcv1q2e/NJzvcYwwe2c/EDR/6vnSVjTPuKAEA8KChBADAg65XJNzKwUc66buues3EZ2WuDfu+lMB1XoEUOHkzjh5jE0fbsPOum5xyze4J3+WT8Ua+ifOODVsMIiLKbuO3dsARTtaAG941cf9aK6M6/MjNDU387umHm7hgyXKnnM51u+dRMpsvtf9vv3xwuIkzlNtUFEjxW2amiLudY6625XpUc4c5vr3xURMfmXqLiRs/UP66YbmjBADAg4YSAACPCt/1mtK5vYnn3lzNxJd1+dEpd0PdKSbu8ehgJ2+/oeXvVj/ZpXbINnGwq1UkfHfrn/k5TvqPvOomzpd0J++QKrYLLjXQLfjrVcOcct222K7Y/R91/w6OrrvQxBOkZrF1qtRSUk247K7DTPzbtSPCviVH2+7slXnu+awa6LXbN7W6k9evpu1i7TfxbRMP29jaKfdFnwNMnLdkadh6oHhbztxm4nRlz29oV+vSvJ0mvmv56WGP9+OclvZ4Ndxu8W+PetrER55pn0Zf9pj7dKzOcf9OEoE7SgAAPGgoAQDwoKEEAMCjQoxRqgzbZ726/8FO3o932DGnrQW2D/zw1291yn3dxY5lHHfpVCdv7tCYVBMlMOeOTBOHjkkGz+PxP11t4gbDqjrlUif+HPb4666xUxT6DPzaxHfW/8Upl+8Ohzi+3dAqkPozfMFKasXgSMcl80zc+VU7JtzytslOudT2bUw85x9ZTt7ME54xcXCqwk11Frgf9oENP+/ewsnKX7c+bB1RqPnVK0w88BM7J2rmhv2ccnUCs6zy5y2UcLJlQ9i8w575u4nnnWbHK7vccoNTrvH9iX+GhDtKAAA8aCgBAPAot12vKVVtN9ucoZ1MvOA0t4vniU22u+atISebuNWbId062bYbbUarLk6ePs0+l562wz6+nvbFtJJWGxH63zFPB1Lu9drAP+zj5g3P+j2q49d/1p7/L9fapXnuHPFLccWLNfcT+7fVmK5XUWnuz0WVoyLryjzgf7YrrU1Id2tQ/uz5tlxfN++Y/rav76HbR5q4e9Vcp1ywK/aLrAPdg9D1ulf5GzeaePooO3xRe6E7RSN/Xvhhj0ilbi/+Pq1j77lOevP9pf6oUuOOEgAADxpKAAA8aCgBAPAoN2OUKdXdJatWvNrMxAu62UfDH9vYxik34YbjTJz51Q9hjx98hLn6xi1O3qDJE008erV9JHrzF3upNKJ2YBW75Fzo8lhT59nH+rOl9ONKWTPt+OK3u9wpJvVm5YUWN7QKm1UppTZt7KSnHvxaseWe2NTSSbd7xo575YcWjlD9kXZsc9zVh5i4e8PwY54onXqjE/P/tk99d3P1V6RxmJJlhztKAAA8aCgBAPBIaNdrsLt1zqMHOHnB7tZHNrQ18dend3DKpS4u+WPKy65wu297VJtg4g372OO9WLuTUy5/0+YSfxaKd/zMc0z82QFvOnlju4828X3iTuWJVF4Pu4LTPvfabveWae45rH/LYhNvf889hip+b9pKa8kFDcPmbdN2+sDr95/s5NX6PfyQSDQWXdHcxN+Nd3cJOirDbuA9v79b35Z321VndF74LnfER84p3Zz0Fb0mFlvu3bVdQ15J/NQs7igBAPCgoQQAwCOhXa9/XtLZxAtOf9LJ+3CHXTT76zM6mjhv8ZJSf+7uWuH71Gbvst01dLXGT+Yg+6f39NtuV3j/WvNMPO+pQ03c4b+rnHJrTrRPw512/SQnr29tu1h+w7TgyufuKugvthxv4j693cWY86rR95par66Jb7/8zbDl3t5qn1Su9Upsu1pD5c+yK7dcPqG/k7fgdDtkM7uv+5ty6juB5X5+mhmfylVyqTXdDc7XXGR/u68Z5I5tBDfjXhLYCHr9w+5i9lXpegUAoHyjoQQAwIOGEgAAjzIdo0xr5D6ufdvgV028In+Hk/fAPQNNXHNR6cc80lo2N3GfU34MXxBlIrhTxEvDTnHyBtxj8+acERhnOsM9RkrgOq9ACtxMKX5H5ttXH+Gkx39tV3lp99tyJ++ah+zOJRPudsdeKgsV2MXnkqy1npKJUXNOyE/Y6cWXExGZe639b8m+Kk4VSlIpXdxpeSu71zbxlrZ2qs3VR7nPCgyu95XnqHbpq54f3Wzi7PFToqxl/HBHCQCABw0lAAAeZdr1WlDP7b46p4ZdLPnf6w5z8mq+WvLu1uDGsisGHerk3XH1Gya+MDPxjxtXdjvPsOfnmGumxvz4/f7oZeI/b25q4pQZC5xyrXfYvzPWaoneVxvbBVKbElYPlEza/vs56csn2YXQT6q+2sTp4naHpqvUUn/20bfa4bXsN2L/GxBL3FECAOBBQwkAgEe52Y/y9JrTnfQH/W8ycfqO8CukbDjVrujwwZFPmbhVmttV8O52+5RW6/evdfKCq3lM3dAskLPSX2mUyIYr7ROn59/yqYkH1ZkXUjKy67dg90+HJ91VdZrc930gZbsCQ5+N9UlRJSmdnBZd1TyicjNft09FNpDvPSVRnug67nDYWTU2BFJV4vrZzqYDBdHuVFo2uKMEAMCDhhIAAA8aSgAAPMp2eshvc5109pv28eB55z/l5E25x135PxKf7Kxn4jNH/83Ja/rQNBO3a7vFfWNgNY/5U+0YZUvGKEslrVkTJ333nWNNfEr1rSYOXVVnQ77dBPj0GfY8vnjAC0651ul29Z20XaWqarEKNNeRu5rtTnQVEE+r3Klyh0272MRd97UbXX/z5YFOuWprlBRnZwP3eZJ/n/O6ic/JXOfk9b5zook/ku4mzno9vrvPRINfAgAAPGgoAQDwKNvpIdq9LW/9d3uLfeic65y8gt4bpTib1mY56ebv2LjKJ3Z1hyYhj6gHP1nPmOPk/WfdASa+9CS7qO/3t8X38ehklNq2tYkfmPCyk9c23U7nWJpnu1d7vzzYKdf6qT9MXHeFnTrS5yX3b2TOCaNtuZNCuskfD6wcEuWj52NePdnEjZnygCSUv9H9nd3ndJsObhHQQiZLNF56wq649sTz1Z28Lw+0q6VNujqwefubIav+lIOpI9xRAgDgQUMJAIAHDSUAAB7lZgm7+s+G9IE/W3y5fWPwWan16jrprtXtWOm0HS1i8AmV1/x7Mk0cHJMUEfl8px1f/td9N5q4+fPuuQ+3i0fry9xlDs+ZdKqJJ3R8y8k7fKBdAnHfEdGNLza+n3FJn1WBzdZrLi3/e6/UWMAzB2Utb5XdgSTzZDfvlqlHm/ijdu+a+PCrr3fK/aVtSADuKAEA8KChBADAo9x0vZYl3cjtwD21+jYT3/SN3eEiW34qszolixcOfy5s3sM3XWbiuh+Wvjtl4SctbcLtrZGrBo438fsj6gliLyvFdq3n1LRxtTh/bmp7O5Xg0qsnRPy+ZmMXmbj8dxTHTmqdOk5a77arLRVs317W1TE++bqriR+/0A5znHXdV065b56tWmZ1Coc7SgAAPGgoAQDwqJRdryt61Q2bl7YuvQxrknxSA2sgpYRch2WszwktXirNX7BdaS/3dRdgP6raAhN/WD/bxPnr1se0Dskua1bgSdGT3LxMZRelP+ImuyrW7BfjW6dGL9hVmG6uMz9sufZj3ZWcWv45NUzJ5JPWpLGJO7y3wsn74D07vNR0SHyf7FYZ9m9k6eCDnbzber8bWrywTlXWhbzSuNhyZYk7SgAAPGgoAQDwoKEEAMCjUo5R5tTRey+EqLy8/kgTd234rZO35O82bvlABxMX/PJ7VJ+l8+yuApvz3Z0J2lex14Brz7JjlPVGRT4tZeuFh5u4PG4mWxaavL7EJm4OX+7A6navidmyX8zrsehBO672ZqPHAjkZTrlRm+1YdevHFzh5+XmVZ1LI5kMbmfjBBu87eXde9Z2JD67/dyev7eiQTe0jsOi82ibOreNuwn5vz7dNfH6mOx6aInbz5+C7nrr3XKdcLUn8d487SgAAPGgoAQDwqJRdr4ifTz8/yCb6ul2vM44eY+KV79mpIo+u7eGU+/ibrhKJcWcPNXHoAuzTc+w14D6v/Gpit2PI79x/fmriCa/XLME7k4cOrNwybGNrJ++mOrZr86KspSa+78XeTrm2j9jF0wtCNk0PZ9t5hznp6Zc+buJqgWkpwa5WEZH3z7Fd//l/hp86kuxqrNhp4uDG9CIi/6w/08Rzz37KyUs5O9gdGpzqpZxywTzn/RGWExFZG1hU/6j3bjFx9tvu5gflYaCMO0oAADxoKAEA8KChBADAgzFKEUlV9nqhzqwEViQJtB660MQ/XuAuB3hYRq6JG6fZPSYeDZlG8ugFbjqcFLHHLwgZffx4ayebt2OHRGPU7KNM3FR+i+oYFV3+ps0m/qKPO9YlH9gwOF45v8dop9hLh9rpIv993X30P+iSs7+0ca1HnbxqqnpocREReeLlM5x049lsti0iIj/MMOHXNx/hZJ34DzvW/L92bzh5wWUJQ8cbg9ypHXYU8ZWt7s5M52ba5QY7fjLQyWs2zh6jzYc/mrg8jEmG4o4SAAAPGkoAADzoehWRfG277erM3uYpib3JX7PWxA+efI6TN3fgPibu3+MLEw+qG93KPP2WHm/iqRPcbsGWY5YGUsslGk3Pq5zdreHkLVnqpF8dFthO5KZAWMddEeeyrNU2vnpEhJ/mdrW+sKWhid859zgTN579o8Av7Ytp7gv2qyenn3aTk7XyIrup85Rj7NSRc+de6JRb94Hd0UMFRj0avuJO/xnb2XaNZ3/5U8R1Lm+4owQAwIOGEgAAD7pexX3qFbGTP2+hk249yKa/lBqBuFuUn2AXcG4q7tOOlWf568QJLjD/6Qv1Tfx58y5OuTnX2ychjz7UdrN/O6WDhNNu5EYnXTBvsYl17tySVxbFqjp+ipNuOd7GF4pd5ShN3G73/ULSe+SHpNO+3FCq+pUXtBAAAHjQUAIA4EFDCQCAB2OUIrIw104JSd1kV3EJ7W8HUDyda6cV5M9f5OS1ucmm1wRf92zIy3cP5Ql3lAAAeNBQAgDgUSm7Xpv/c7KTHvjPowMpd0oDAKBy444SAAAPGkoAADxoKAEA8KChBADAg4YSAAAPGkoAADyU1jrRdQAAoNzijhIAAA8aSgAAPGgoAQDwoKEEAMCjQjeUSimtlNqulLovwvL9lFLbit7XOt71Q8lwPpMP5zS5RHE+hxSV10qpCru2eIV+6lUppUWkjdZ6QeC1kSJynIi0EZG/aa1fiOR9SLzQ86KUyhaRh0XkSBFJFZGpInKj1nqu730oP4o5p8eIyMchxWqIyLla63fCvQ/lQ5jf3C4iMkZE2ovIbBHpp7X+JZDfXEQWi0i61jqvTCscIxX6jjKMX0VkoIj8nOiKoNRqi8j7ItJWRBqIyBQReS+hNUKpaK2/0Vpn7vlHRPqIyDYR+STBVUMUlFJVpPA7+bKI1BGRsSLyXtHrSSPpGkqt9ZNa6y9EZFei64LS0VpP0VqP0Vpv0FrnisjjItJWKVUv0XVDzFwuIm9rrbcnuiKISncp3K5xqNY6R2s9XESUiJyQ0FrFWNI1lEhqx4rIaq31+kRXBKWnlKouIudK4V0IKqaOIjJDu2N4M4peTxo0lKgQlFKNReRJEbk50XVBzJwjIutEZFKiK4KoZYrI5pDXNotIVgLqEjc0lCj3lFL7iMinIvKU1vq1RNcHMXO5iLyoK/IThdgmIjVDXqspIlsTUJe4oaFEuaaUqiOFjeT7WuuIHklH+aeUaiKF41svJrgqKJ1ZItJJKaUCr3Uqej1pJF1DqZSqopSqKoUDyulKqapKqaT776wMlFI1RWSCiHyntb4j0fVBTF0mIt9rrRcmuiIolYkiki8iNyqlMpRS1xe9/mXiqhR7ydiAfCoiO6Vw7t3IovjYhNYI0TpLRLqJyJVFk9D3/NM00RVDqfUVHuKp8LTWu0XkTCk8n5tE5G8icmbR60mjojeUOSIyTSl1754XtNbdtdYq5J+JIiJKqSuVUpuK3leQmCrDwzmfWuuxReevRnDundZ6qQjns4L4y3dURERr3U5rPSa0MOe03CvuN3e61vpgrXU1rfVBWuvpe/KUUvdI4dz2HBGpsGPRFXplHgAA4q2i31ECABBXNJQAAHh4V3PvlXIe/bIJ8lnBW2rvpUqOc5o48TinnM/E4TuafMKdU+4oAQDwoKEEAMCDhhIAAA8aSgAAPGgoAQDwoKEEAMCDhhIAAA8aSgAAPGgoAQDwoKEEAMCDhhIAAA8aSgAAPGgoAQDw8O4eUtHMH3uQief2HOXknXD9QBNXH/djmdUJACqL1I5tnfSSs+uZ+JDeM528F5t9beJcnR/R8XtcN8BJV3t3SkmrGBXuKAEA8KChBADAI6m6XkXbPTcLpMDJWtHDxm3GlVWFEJTWopmJl53VyMRbs/Occm2zV5h4fNv3TZz9wbVOucYT7HVezemrnTy9bYeJ8//808Qqzf2TX3njoSbOq+bWt+kj0+zxcnIEwF9tufhwE596x0Qnb1y938K+L1fb72/o73U4Tw8d5qQHz+1r4vzZ8yM6RjS4owQAwIOGEgAAj+TqevVo1X6liVVGhpNHt1p8rB50pJP+afATJo60qyVYal6fZ9y8PuGP8cbW/U383N/PMvHKY9w/+d8ud7tygk6beLWJ1Xe/7K2qQNJKqVrVSS/8V1cTz7pshIkj/V5HKzu9ipOefVMdm3dtaOnY4Y4SAAAPGkoAADxoKAEA8Kg0Y5QftXvXxGdk9nLy8hmjjJnU1i1MPPamx0NyS/7nNm7bviY+J3NdxO+7IGuVjUc/ZeKUkGvD4IjK9Bw3L3XzrmLLVSZrbrTjzFsO2eUpGV/pGXYK0cyjnw9brk+jg8uiOpWDstPtgmOSIiK/XTY8kCr9/VaHN28Im/f7+U+EzXvg+LdM/PyhfWzGlPDTUqLBHSUAAB40lAAAeFSarleUjZW97bSM9lXCX4ed8NsFJq5xb82w5dJXbTLxmIa1nbycevZR8YEPveXknZW5du+VFZGZu7WJB98y0MmrPpPF87cfblc4mn3cqLDlgl3a0U4RiPQYwZyXtzSJ6rNQvIJjbBfrov729d9PGF5M6b96e9t+Tvqf39qpWU3ed38Pqr1nFzRvLT+YWHXt6B70/PCfF/yeD29Zw8RZMV4rnTtKAAA8aCgBAPCgoQQAwIMxSsTU0ZdNC5u3Kn+nidf81sDEqaeEP16Dn+w45JpDUt3P6mkfAY90TDLUB1u6mJgNvf+qzcDFJj476ywnb/EVTU2cU8eOHCotUSmov9vEs3s+G7Zcu4/sWHL72xaE5G6M7sMrq8AUEJHQccmRER3itLmnm7jg7n2cvOzvfoq+buUId5QAAHjQUAIA4EHXK2Lqw586m/ih075x8pqmZZp49sUjJCJX2jBduV2vuTo/kHKv+dYFunmPeetWE0887xGn3J31bfdt9/Ovc/Iy3/xBKrv8TZttIhiLSJN7l8f0s7adbzcAlp5u3oJcuzJP+4c32PptpKu1pII7gYSuuBPpNJAfc9JNrE+wG60rWVFc8QqPO0oAADxoKAEA8KDrFTGVPcAuiXFQvX5O3m9HvWDiaFZvyQ15mvL97XbT1mGLezh5KcPqm7jVR7YL9ZgaNzvl5pz2pIlX9sp38rLfLHEVUQqr+uwOmzdkuV3wOn/ewrKoTtLS7VuZ2F3cPLz2X1zjpFuNtN/fFEn+Tc25owQAwIOGEgAADxpKAAA8GKNE3LQc4o45de94XZiS0an902oTV1u0OCQ3NL13B2Yvc9Js51225vcYbeKCkGv4aVPamLi1rC+zOiWjFT1qmTh0I/OgcdvrmrjNiFw3M8YbI/sE6/jXKWI21u4iQzGuAwAACIuGEgAAD7peETf5s+Y66cxZsT1+3t6L/EXb7PArh/w2z90EOFtWhymJeCgQHYjd6UPRLrQOkbQmjZ30yRdPNrFvmtbtX9rN1bOnxHgnZI/ld7vpYB1Dp4hdvsQu4VTnw99N7E70Kj3uKAEA8KChBADAI7m6XgP9M6FPc4U+LYXKI7fnwSae0NbdY29yYHHntk/tcPLo7YuvnWccGvJK+L1M8+vapy4XvWr3ED242VKn3KD9P7PvEfcxyKufu97ETf7zfUmqWqFtOMbtev1Pg3Fhy/aaeb6J2982x8Sx7soMteSNTiZ+rssLEb9v4TPtTFx7y2RPydLhjhIAAA8aSgAAPGgoAQDwSK4xysDSDKGPPQcfK559fysnL/uaDYLkkpKVZeL7R9pxydCx6q+32TEOPT3G81eSTGqDfZ301iNbmHhnXXvNnXL2uoiON7bj0JBXMsKWnXPiMxEds98fvUw87ZMOTl7zx+wuFyXfu6biWn/6jr0XKrJseT0TZ28p+epW0bqt06cmPiQj/Ihov6XHO+l6nywwcTzHUbmjBADAg4YSAACP5Op6jVSVytTxUjmk1qvrpLe9ahd+7poRfmWP5yYdZ+I28mN8KleB5Z54iImz7l7i5I1rOcLEwelYkW/Knb73IkWCXap/3tw0fMEfZpiwqbhTQCrrt/7OLp84ad9C6Nn9fop3dYwtH9shsL41g1ODwtfv9+c6Oul6f8ZvSkgQd5QAAHjQUAIA4EFDCQCAR+Uco0TSWdavnZP+6YBhxZb7z7pOTrr942tMHM1uJMnuj1PsT8SElhOcvFe2NjLxpvzqJn5vZWen3NqvGklxhvd71kn3qGYf8O/280VOXt0+8wKpTf5Kw5Gv3fuhyMeQSy+1tn1WYMEzzZy8WZ2ej6hOHd68wcStR5XNmGQo7igBAPCgoQQAwIOuV1QYwdV2RETWvNLQxO90fjikdBUTDd9ou2UnPHSMU6rWoh9iV8EkVHu2Xe0q+6Nrnbz2g213aP6mzSauIn845RqHpPf49WK3K+7YqvOjrifKh+BOPSIiDe6153Rc0zEhpYu/T/t8p/s9bzvKrpwW711MwuGOEgAADxpKAAA86HpFTK0edKSJq/R0F8d+tMObJi7QkV2j3bfkVBMPafGukxdccSfY1Rrqqwvs6jK1ZtHVWhL1R04OxG5ePLvB0l+uu/dCiLn1Vx1h4nqjI3vCdN7ztru1WaP1Tt6opl+UuA43E5sXwwAAA2hJREFUfHy5k27ze+JXzOKOEgAADxpKAAA8aCgBAPBgjBKlsvWCw530T4OfCFs2uGlyrs6N6PgftbPjkqGbLgd3AtlcsMvJ6/HIYBPvN8vdRQKJE9z8uWF68dNGRETSdlXWvT5i76EZJzrpvkc/H6akSId+dvPyn/a3zxv0v/Ajp9x1tReaOF3ZDbFzdejIdfh7seD3OXvs9SZu84/ErL7jwx0lAAAeNJQAAHhU+K5XlWb/EzJq7E5gTSqnVb3cpcR9ixsHu0qjWZg5dNPl4DH+b3UPJ6/Rp3+aOFGreeCvth7ZwsRnZX4Ykst1ezw0HulukD25m+3yPCzDHQJxpnNcG35qR/DbG+n3OrhClojIqPG2S7jlv342ccjXvFzgLxMAAA8aSgAAPGgoAQDwqPBjlCktmpr4lyOfC1suOH2g4UcV/j87oVLr2eXFLjp4SgJrYj3e8Bsn/dX4TBM/cXR3E+etXiMoH1JCrtOD39G0bYwsx0raF9Oc9K1DBpj4m/uHx/SzluflOOmH1vQy8bIrmjh5LX6300DK47hkEHeUAAB40FACAOBR8fsgN2wy4YEv3mjiQ46d4xRb/nAbE2e+m/jV6Cuy3A52w9179p0Q8+Of/Pu5Jl4zqZHNUG65Oy6xu5FckLXKyTu+2jYTP5ERfmcRJE7oVIIXNx9o4vTPp4UWR4zU/8SuqtO1yU1O3vQBw0p17LOG3eak938suCrWPKmouKMEAMCDhhIAAI8K3/Wav36DiVsEFtNdH1KumpSPpzOTQfoq29199PRLnLxvu74S9n2r8neauNdLdtHy1iOXO+UyVtpu1Ca54RfOfv2ZriZ+o/oRTt6WgxuaOGtLxe3yqUxGzT7KxE3ltwTWJLnlr1lr4ib/Wevknf6fbqU69v6SnBsQcEcJAIAHDSUAAB40lAAAeFT4MUqUvfwFi01ct4+bd7pENsbRXOx4cp6nnLcef/4ZNq/6H8tsuSiPj9hb0TN8XuZHmeEzgQTijhIAAA8aSgAAPOh6BVBmUnbZ5ZUeXX+Ak1f3+cmhxYFygTtKAAA8aCgBAPCgoQQAwIMxSgBlptUtP5h4klRLYE2AyHFHCQCABw0lAAAeSmud6DoAAFBucUcJAIAHDSUAAB40lAAAeNBQAgDgQUMJAIAHDSUAAB7/DxK8xwtogAslAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")\n",
    "\n",
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.350038, the validation accuracy is 0.867\n",
      "after 200 training steps, the loss is 0.48012, the validation accuracy is 0.8996\n",
      "after 300 training steps, the loss is 0.216543, the validation accuracy is 0.9236\n",
      "after 400 training steps, the loss is 0.164641, the validation accuracy is 0.9268\n",
      "after 500 training steps, the loss is 0.355863, the validation accuracy is 0.9408\n",
      "after 600 training steps, the loss is 0.0300782, the validation accuracy is 0.927\n",
      "WARNING:tensorflow:From C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:960: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.378117, the validation accuracy is 0.9494\n",
      "after 800 training steps, the loss is 0.231794, the validation accuracy is 0.9492\n",
      "after 900 training steps, the loss is 0.0263152, the validation accuracy is 0.9414\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9498\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*验证准确率：0.9414*  \n",
    "*测试准确率：0.9498*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\Users\\ilove\\Anaconda3\\envs\\tfl1.14\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:1276: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*测试准确率：0.9375*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 对模型结构的理解。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.这是一个两层的全连接神经网络，它含有输入层、一个隐层和输出层，而感知机和单层神经网络的区别就在于激活函数由阶跃函数换成非线性函数。  \n",
    "2.输入层为 784 个 node 的张量，为 28x28 分辨率并经过二值化后的图片的所有像素点组成的一个向量。  \n",
    "3.第一层为隐藏层，有 100 个 node，其值为输入层的 784 个 node 乘以 784x100 个权重加上偏置项后的和，经过 relu 激活函数取得的结果。  \n",
    "4.第二层为输出层，输出 10个 node，其值为隐藏层的输出值乘以 100x10 个权重，加上偏置项取得（此时的输出未经过激活，后面将使用 softmax 函数进行激活）。  \n",
    "5.在编写程序时，对于需要持续更新的变量，在定义的时候使用 tf.Variable(),比如权重参数和偏置项; 而对于输入 x 和标签 y，在定义的时候使用占位符 tf.placeholder()。  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 对模型训练过程（梯度如何计算，参数如何更新）的理解。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.模型一次训练过程包括前向传播和反向传播。    \n",
    "2.对于神经网络采用的损失函数为交叉熵损失，参数更新的方法为梯度下降法。参数调整的算法为反向传播算法，核心是通过比较输出值 y 和真值 t，对参与计算的 w 进行调整。  \n",
    "3.前向传播过程中通过权重与输入数值相乘累加，并通过激活函数得到输出值作为下一层的输入值，逐层计算得到最终的输出值。  \n",
    "4.梯度的计算是通过对每个权重进行求偏导数，然后在负梯度方向对权重参数进行更新，在偏导的求解过程中，最核心的思想是通过链式法则。  \n",
    "5.反向传播过程的核心，是通过比较输出 y 和真值 t，对参与计算的 w 进行调整。其计算方法是从网络的输出层开始，向输入层方向逐层计算梯度并更新权重，与前馈运算正好相反。首先计算输出节点的总误差，并将这些误差用反向传播算法传播回网络，以计算梯度。接下来，使用类似梯度下降之类的算法来调整网络中的所有权重，目的是减少输出层的误差。当计算一个节点的误差项时，需要先计算每个与其相连的下一层节点的误差项。这就要求误差项的计算顺序必须是从输出层开始，然后反向依次计算每个隐藏层的误差项，直到与输入层相连的那个隐藏层。当所有节点的误差项计算完毕后，就更新了所有的权重。  \n",
    "6.参数更新采用的是负梯度方向，用之前的参数减学习率乘以损失函数对该权重参数的偏导。  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. 对计算图的理解。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.计算图主要由四个部分构成：1、张量（Tensor） 2、操作（Operation） 3、变量（Variable） 4、会话（Session）  \n",
    "2.变量（Variable）是在优化运算过程中可以进行更新的节点，被定义成变量，比如权重参数和偏置，而像输入特征 x 和标签 y 则用占位符 placeholder() 定义。在本例中，权重 w 和偏置项 b 都会随着迭代的进行而不断变化着，这样的值就可以拿来作为变量。在实际的训练过程中，一般会把需要训练的值设置为变量。在使用变量的时候会给变量设置一个初始值，然后根据训练的次数迭代，再将真正的变量不断地推断出来, 而当变量被设置初始值后，这个变量的形状和类型就会被固定下来。    \n",
    "3.操作 (Operation) 是专门运算的操作节点，所有运算都是一个操作，比如加法，乘法。    \n",
    "4.会话 (Session) 是用来实例化并运行图运算的关键，在会话中使用 run() 方法来执行计算图的整体或局部操作。      \n",
    "5.计算图是有向图 (directed graph)，神经网络是其特殊形式, 其中节点对应于操作或变量。变量可以将其值提供给操作，操作可以将其输出提供给其他操作。这样，图中的每个节点都定义了变量的函数。进入节点并从节点出来的值称为张量(多维数组的另一别称), 它包含标量，向量和矩阵以及更高等级的张量。\"从左向右逐步进行计算\" 是一种正方向上的传播，简称为正向(前向)传播（forward propagation）。前向传播是从计算图出发点到结束点的传播。\"从右向左逐步进行计算\"，就是反向传播 (backward propagation), 传播的是右方节点的误差项和据此计算出的损失函数对该权重参数的偏导。    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. 解释这⾥的模型为什么效果⽐较差。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.这个神经网络模型只有一个隐藏层，神经元数目也较少，模型相对比较简单。  \n",
    "2.采用的学习率为固定学习率。  \n",
    "3.训练轮次较少。  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
